package jsu.ljy.lostandfind.service.impl;

import jsu.ljy.lostandfind.dao.impl.CommentDaoImpl;
import jsu.ljy.lostandfind.dao.impl.ItemDaoImpl;
import jsu.ljy.lostandfind.dao.impl.UserDaoImpl;
import jsu.ljy.lostandfind.model.Comment;
import jsu.ljy.lostandfind.model.Item;
import jsu.ljy.lostandfind.model.User;
import jsu.ljy.lostandfind.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 评论服务实现类
 * 
 * <p>实现了评论相关的业务逻辑，包括评论的发表、修改、删除等功能。
 * 提供了评论的权限控制和内容验证。</p>
 * 
 * @author 罗嘉毅
 * @version 1.0
 * @since 2024-03-21
 */
@Service
public class CommentServiceImpl implements CommentService {
    private final CommentDaoImpl commentDao;
    private final ItemDaoImpl itemDao;
    private final UserDaoImpl userDao;

    /**
     * 构造函数，注入依赖的DAO组件
     * 
     * @param commentDao 评论数据访问对象
     * @param itemDao 物品数据访问对象
     * @param userDao 用户数据访问对象
     */
    @Autowired
    public CommentServiceImpl(CommentDaoImpl commentDao, ItemDaoImpl itemDao, UserDaoImpl userDao) {
        this.commentDao = commentDao;
        this.itemDao = itemDao;
        this.userDao = userDao;
    }

    /**
     * 发表评论
     * 
     * @param comment 评论信息
     * @throws IllegalArgumentException 当评论内容为空或超过长度限制时抛出
     */
    @Override
    public void publishComment(Comment comment) {
        validateComment(comment);
        comment.setCreateTime(new Date());
        commentDao.save(comment);
    }

    /**
     * 更新评论
     * 
     * @param comment 更新的评论信息
     * @throws IllegalArgumentException 当评论ID为空或评论不存在时抛出
     */
    @Override
    public void updateComment(Comment comment) {
        if (comment.getId() == null) {
            throw new IllegalArgumentException("评论ID不能为空");
        }
        validateComment(comment);
        commentDao.update(comment);
    }

    /**
     * 删除评论
     * 
     * @param id 评论ID
     * @throws IllegalArgumentException 当ID为空或评论不存在时抛出
     */
    @Override
    public void deleteComment(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("评论ID不能为空");
        }
        commentDao.delete(id);
    }

    /**
     * 根据ID查询评论
     * 
     * @param id 评论ID
     * @return 评论信息，不存在时返回null
     * @throws IllegalArgumentException 当ID为空时抛出
     */
    @Override
    public Comment getCommentById(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("评论ID不能为空");
        }
        return commentDao.findById(id);
    }

    /**
     * 查询物品的所有评论
     * 
     * @param itemId 物品ID
     * @return 评论列表，按创建时间降序排序
     * @throws IllegalArgumentException 当物品ID为空时抛出
     */
    @Override
    public List<Comment> getCommentsByItemId(Long itemId) {
        if (itemId == null) {
            throw new IllegalArgumentException("物品ID不能为空");
        }
        return commentDao.findByItemId(itemId);
    }

    /**
     * 查询用户的所有评论
     * 
     * @param userId 用户ID
     * @return 评论列表，按创建时间降序排序
     * @throws IllegalArgumentException 当用户ID为空时抛出
     */
    @Override
    public List<Comment> getCommentsByUserId(Long userId) {
        if (userId == null) {
            throw new IllegalArgumentException("用户ID不能为空");
        }
        return commentDao.findByUserId(userId);
    }

    /**
     * 验证评论内容
     * 
     * @param comment 评论信息
     * @throws IllegalArgumentException 当评论内容不合法时抛出
     */
    private void validateComment(Comment comment) {
        if (comment.getContent() == null || comment.getContent().trim().isEmpty()) {
            throw new IllegalArgumentException("评论内容不能为空");
        }
        if (comment.getContent().length() > 500) {
            throw new IllegalArgumentException("评论内容不能超过500个字符");
        }
        if (comment.getItemId() == null) {
            throw new IllegalArgumentException("物品ID不能为空");
        }
        if (comment.getUserId() == null) {
            throw new IllegalArgumentException("用户ID不能为空");
        }
    }
} 